﻿// 4218. 翻转.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <vector>
#include <stdio.h>
#include <stack>
#include <cstring>


using namespace std;
/*
https://www.acwing.com/problem/content/4221/


给定一个 M×N的 01矩阵。

你需要选择其中一些元素，并对选择的元素进行翻转操作。

翻转操作是指将所选元素以及与其上下左右相邻的元素（如果有）进行翻转（0变 1，1变 0）。

我们希望最终矩阵变为一个全 0 矩阵，并且选择进行翻转操作的元素数量尽可能少。

输出最佳翻转方案。

输入格式
第一行包含整数 M,N。

接下来 M行，每行包含 N个整数，每个整数为 0或 1。

输出格式
共 M行，每行包含 N个整数，其中第 i行第 j
 列的整数，表示第 i行第 j列元素的翻转次数。

如果翻转操作次数最少的操作方案不唯一，则输出字典序最小的方案。

如果不存在合理方案，则输出 IMPOSSIBLE。

数据范围
1≤M,N≤15
输入样例：
4 4
1 0 0 1
0 1 1 0
0 1 1 0
1 0 0 1

4 4 
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1

输出样例：
0 0 0 0
1 0 0 1
1 0 0 1
0 0 0 0
*/

const int N = 20;
int gra[N][N];
int m, n;

const int addx[] = { 1,-1,0,0 };
const int addy[] = { 0,0,1,-1 };

void clip(int x, int y) {
	gra[x][y] ^= 1;

	for (int i = 0; i < 4; i++) {
		int newx = x + addx[i];
		int newy = y + addy[i];
		if (newx >= 0 && newx < m && newy >= 0 && newy < n) {
			gra[newx][newy] ^= 1;
		}
	}
}

bool check(vector<int> firstOp) {
	bool ret = false;  vector< vector<int> >  opv(N,vector<int>(N));
	for (int i = 1; i < m; i++) {
		for (int j = 0; j < n; j++) {
			if (gra[i - 1][j] == 1) {
				//上一行的元素是1  本行需要点击一下
				clip(i, j);
				opv[i][j] = 1;
			}
		}
	}

	//检查最后一行是否全零
	for (int i = 0; i < n; i++) {
		if (gra[m - 1][i] == 1) 
			return ret;
	}

	ret = true;
	//打印操作
	for (int i = 0; i < n; i++) {
		cout << firstOp[i] << " ";
	}
	cout << endl;
	for (int i = 1; i < m; i++) {
		for (int j = 0; j < n; j++) {
			cout << opv[i][j] << " ";
		}
		cout << endl;
	}

	return ret;
}


void solve() {

	for (int i = 0; i < 1 << n; i++) {
		int cpy[N][N]; memcpy(cpy, gra, sizeof gra);
		vector<int> firstOp(N);
		for (int j = 0; j < n; j++) {
			if ((i >> j) & 1) {
				clip(0, j);
				firstOp[j] = 1;
			}
		}
		if (check(firstOp)) return;
		//还原
		memcpy(gra, cpy, sizeof gra);
	}

	cout << "IMPOSSIBLE" << endl;

	return;
}


int main()
{
	cin >> m >> n;
	for (int i = 0; i < m; i++) {
		for (int j = 0; j < n; j++) {
			cin >> gra[i][j];
		}
	}

	solve();

	return 0;
}

 